﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Text;
using System.Windows.Forms;

namespace GPSMap
{
    public partial class frmTestCOMPort : Form
    {
        public bool Connected = false;

        BindingList<string> fooListUI;
        public ComPort objPort;

        public frmTestCOMPort(ComPort comPort)
        {
            InitializeComponent();
            objPort = comPort;
            objPort.comPort_DataReceivedEvent = new SerialDataReceivedEventHandler(comPort_DataReceived);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="text"></param>
        delegate void SetTextCallback(string text);
        private void SetText(string text)
        {
            // InvokeRequired required compares the thread ID of the
            // calling thread to the thread ID of the creating thread.
            // If these threads are different, it returns true.
            if (this.listBox1.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                listBox1.Items.Add(text);
            }
        }

        public void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //Để tránh lỗi cross-thread dùng hàm delegate SetText
            SetText(objPort.ListMessages[objPort.ListMessages.Count - 1]);
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            if (txtData.Text != "" && Connected)
            {
                //Lưu giá giá trị chat trong mảng List<string>
                objPort.ListMessages.Add(txtData.Text);
                //byte[] newrow = new byte[] { 0x0D }; //ký tự '\r'
                
                byte[] start = Encoding.ASCII.GetBytes(new char[] { '{' });
                byte[] end = Encoding.ASCII.GetBytes(new char[] { '}' });
                byte[] newrow = Encoding.ASCII.GetBytes(new char[] { '\r' });

                string msg = txtData.Text;

                byte[] buff = new byte[47]; //kích thước mặc định là 47 bytes
                byte[] data = Encoding.ASCII.GetBytes(msg.ToCharArray());

                //Copy ký tự '{' vào đầu buff
                start.CopyTo(buff,0);
                //Copy dữ liệu vào đầu buff
                data.CopyTo(buff,1);
                //Copy ký tự kết thúc data '}' vào cuối buff
                end.CopyTo(buff,buff.Length-1);
                //Copy ký tự new row '\r' vào cuối buff
                newrow.CopyTo(buff,buff.Length-1);

                //Hiển thị data dạng hex
                string hex = "";
                listBox1.Items.Add(msg);
                foreach (byte b in buff)
                {
                    hex += string.Format("{0:X2} ", b);
                }
                listBox1.Items.Add(hex);

                try
                {
                    //send data
                    objPort.WriteBytes(buff, 0, buff.Length);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Xảy ra lỗi khi kết nối:\n" + ex.Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                txtData.Text = "";
                txtData.Focus();
            }  
        }
    }
}